package jsu.ljy.lostandfind.model;

import java.util.Arrays;
import java.util.Date;

/**
 * 物品实体类
 * 
 * <p>表示失物招领系统中的物品信息，包括物品的基本信息、状态信息和认领信息。
 * 用于物品的发布、查询和认领管理。</p>
 * 
 * <p>物品状态说明：
 * <ul>
 *   <li>LOST - 寻物启事</li>
 *   <li>FOUND - 招领启事</li>
 *   <li>PENDING_CLAIM - 等待确认</li>
 *   <li>CLAIMED - 已认领</li>
 * </ul>
 * </p>
 * 
 * @author 罗嘉毅
 * @version 1.0
 * @since 2024-03-21
 */
public class Item {
    /** 物品ID */
    private Long id;
    
    /** 物品名称 */
    private String name;
    
    /** 物品描述 */
    private String description;
    
    /** 图片路径 */
    private String image;
    
    /** 拾获/丢失地点 */
    private String location;
    
    /** 发布时间 */
    private Date createTime;
    
    /** 物品状态（LOST/FOUND/PENDING_CLAIM/CLAIMED） */
    private String status;
    
    /** 发布用户ID */
    private Long userId;
    
    /** 认领用户ID */
    private Long claimUserId;
    
    /** 认领时间 */
    private Date claimTime;

    /**
     * 默认构造函数
     */
    public Item() {}

    /**
     * 获取物品ID
     * @return 物品ID
     */
    public Long getId() {
        return id;
    }

    /**
     * 设置物品ID
     * @param id 物品ID
     */
    public void setId(Long id) {
        this.id = id;
    }

    /**
     * 获取物品名称
     * @return 物品名称
     */
    public String getName() {
        return name;
    }

    /**
     * 设置物品名称
     * @param name 物品名称
     * @throws IllegalArgumentException 当名称为空时抛出
     */
    public void setName(String name) {
        if (name == null || name.trim().isEmpty()) {
            throw new IllegalArgumentException("物品名称不能为空");
        }
        this.name = name;
    }

    /**
     * 获取物品描述
     * @return 物品描述
     */
    public String getDescription() {
        return description;
    }

    /**
     * 设置物品描述
     * @param description 物品描述
     * @throws IllegalArgumentException 当描述超过长度限制时抛出
     */
    public void setDescription(String description) {
        if (description != null && description.length() > 500) {
            throw new IllegalArgumentException("描述内容不能��过500个字符");
        }
        this.description = description;
    }

    /**
     * 获取图片路径
     * @return 图片路径
     */
    public String getImage() {
        return image;
    }

    /**
     * 设置图片路径
     * @param image 图片路径
     */
    public void setImage(String image) {
        this.image = image;
    }

    /**
     * 获取拾获/丢失地点
     * @return 拾获/丢失地点
     */
    public String getLocation() {
        return location;
    }

    /**
     * 设置拾获/丢失地点
     * @param location 拾获/丢失地点
     * @throws IllegalArgumentException 当地点为空时抛出
     */
    public void setLocation(String location) {
        if (location == null || location.trim().isEmpty()) {
            throw new IllegalArgumentException("地点不能为空");
        }
        this.location = location;
    }

    /**
     * 获取发布时间
     * @return 发布时间
     */
    public Date getCreateTime() {
        return createTime;
    }

    /**
     * 设置发布时间
     * @param createTime 发布时间
     */
    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }

    /**
     * 获取物品状态
     * @return 物品状态（LOST/FOUND/PENDING_CLAIM/CLAIMED）
     */
    public String getStatus() {
        return status;
    }

    /**
     * 设置物品状态
     * @param status 物品状态
     * @throws IllegalArgumentException 当状态值无效时抛出
     */
    public void setStatus(String status) {
        if (status == null || !Arrays.asList("LOST", "FOUND", "PENDING_CLAIM", "CLAIMED").contains(status)) {
            throw new IllegalArgumentException("无效的物品状态");
        }
        this.status = status;
    }

    /**
     * 获取发布用户ID
     * @return 发布用户ID
     */
    public Long getUserId() {
        return userId;
    }

    /**
     * 设置发布用户ID
     * @param userId 发布用户ID
     */
    public void setUserId(Long userId) {
        this.userId = userId;
    }

    /**
     * 获取认领用户ID
     * @return 认领用户ID，未被认领时为null
     */
    public Long getClaimUserId() {
        return claimUserId;
    }

    /**
     * 设置认领用户ID
     * @param claimUserId 认领用户ID
     */
    public void setClaimUserId(Long claimUserId) {
        this.claimUserId = claimUserId;
    }

    /**
     * 获取认领时间
     * @return 认领时间，未被认领时为null
     */
    public Date getClaimTime() {
        return claimTime;
    }

    /**
     * 设置认领时间
     * @param claimTime 认领时间
     */
    public void setClaimTime(Date claimTime) {
        this.claimTime = claimTime;
    }
} 